iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 18

Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic functions (Part 2)

  • 分享至 

  • xImage
  •  

前言

在前一篇文章中,探討了Semantic Functions的Inline寫法,透過Prompt Engineering的概念,展現了LLM模型的能力。然而,Inline寫法的一個明顯問題是不利於重用(reuse)。因此,在本篇中,將介紹Semantic Functions的另一種寫法,可以使用Semantic functions達到重用(reuse)的效果。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

結構化 Semantic Functions

為了實現 Semantic Functions 的重用(reuse)效果,必須對 Semantic Functions 進行結構化的調整,透過三個簡單的步驟便能完成。

  • 首先,建立一個名為Plugins的目錄,用於歸納整個LLM應用中的所有Plugin,這有點類似於網頁應用中使用一個CSS目錄來整理所有的CSS文件。實務上,一個LLM應用通常會有多個Plugin,因此可以進一步劃分成不同的子目錄。最後一層則是代表特定function的目錄。

例如這個範例,Plugins\WriterPlugin\FairyTales

  • Plugins表示all Plugins的總目錄
  • WriterPlugin表示有個"寫作"的Plugin
  • 最後FairyTales則表示在"寫作"的Plugin裡,有個FairyTales童話故事的function

https://ithelp.ithome.com.tw/upload/images/20231003/20126569vBQjrJ2xDm.png

  • 接下來,在指定的function目錄中建立config.json檔案,這個json file在運行時會反序列為PromptTemplateConfig物件,因此它的結構必須與PromptTemplateConfig類別的屬性相匹配。
  1. type,prompt類型,目前僅有completion。Semantic Kernel未來會再擴充其它類型
  2. description,針對這個function要的任務描述,會影響到使用planner 自動規劃的成效
  3. completion,針對模型的參數,以OpenAI模型來說,就是max_tokens、temperature 這些參數
  4. input,定義這個prompt template裡的參數,這些參數將對應至skprompt.txt檔案中的變數,每個參數都包含三個屬性:name、description以及defaultValue
{
     "type": "completion",
     "description": "產生facebook貼文",
     "completion": {
          "max_tokens": 500,
          "temperature": 0.2,
          "top_p": 0.0,
          "presence_penalty": 0.0,
          "frequency_penalty": 0.0
     },
     "input": {
          "parameters": [
               {
                    "name": "post_subject",
                    "description": "貼文主題",
                    "defaultValue": ""
               }
          ]
     }
}
  • 同樣的在該function目錄下建立skprompt.txt檔案,其內容就是Prompt,用於發送給LLM模型的請求
你是一位facebook小編,請使用輕鬆灰諧的語氣,撰寫下列主題的貼文,內容500個字以內,#zh-tw
###
{{$post_subject}}
###
  • 最後呈現的結構示意範例
    https://ithelp.ithome.com.tw/upload/images/20231003/20126569LcmVCsEJjp.png

示範演練

以前一篇的few-shot範例進行改寫

  • 同樣的Kernel物件不可少
var kernel = new KernelBuilder()
         .WithAzureChatCompletionService(
          deploy_model,   // Azure OpenAI Deployment Name
          aoai_Endpoint, // Azure OpenAI Endpoint
          api_Key  // Azure OpenAI Key
         ).Build();
  • 載入Plugins,這裡的Plugin是指WriterPlugin,前幾篇介紹時有提到過Plugin是1~多個能力(function)的組合
// Import the Plugin from the plugins directory.
var pluginsDirectory = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Plugins");
var plugin = kernel.ImportSemanticSkillFromDirectory(pluginsDirectory, "WriterPlugin");
  • 準備Prompt Template的變數值內容,以這個範例來說有2個,其中一個是few-shot的資料,而另一個則是貼文的主題
//few-shot,帶入方文山詞創作範例
string fewshot_sample = @"
竹籬上 停留著 蜻蜓
玻璃瓶裡插滿 小小 森林
青春 嫩綠的很 鮮明

百葉窗 折射的 光影
像有著心事的 一張 表情
而你 低頭拆信 想知道關於我的事情

月色搖晃樹影 穿梭在熱帶雨林
你離去的原因從來不說明
你的謊像陷阱我最後才清醒
幸福只是水中的倒影

月色搖晃樹影穿梭在熱帶雨林
悲傷的雨不停全身血淋淋
那深陷在沼澤我不堪的愛情
是我無能為力的傷心

蘆葦花開歲已寒 若霜又降路遙漫長
牆外是誰在吟唱 鳳求凰
梨園台上 西皮二黃
卻少了妳 無人問暖
誰在彼岸 天涯一方

在夢裡我醞釀著情緒
等回憶等那一種熟悉
人世間最溫柔的消息
是曾經被你擁入懷裡
";
  • 建立ContextVariables物件,帶入變數值
var contextVars = new ContextVariables()
{
    ["fewshot_sample"] = fewshot_sample,
    ["post_subject"] = "ChatGPT對校園教育的衝擊"
};
  • 叫用semantic function取得GPT模型生成結果,這裡指定的FacebookPoster就是function目錄
var result = (await kernel.RunAsync(contextVars, plugin["FacebookPoster"])).Result;
  • 生成結果
    https://ithelp.ithome.com.tw/upload/images/20231003/20126569f1e6j8MkVu.png

範例原始碼 : https://github.com/iangithub/sklearn/tree/main/SerializingSemanticFunction

結語

本篇內容說明如何對Semantic Functions進行結構化處理,經過結構化後,Semantic Functions能夠在不同的程式片段中實現重用(reuse),並且將來要調整時也會比較方便。

結構化後的Semantic functions便可以輕鬆的在各個不同的程式片段內達到重用reuse的效果,並且將來要調整時也會比較方便。下一篇系列文章,將再進一步整合開箱即用的Semantic Kernel內建的Plugins。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 Semantic functions (Part 1)
下一篇
Semantic Kernel的實踐:Semantic Kernel - Plugins開發篇 native functions
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言